Add a function to turn a css style into pango attributes
authorMatthias Clasen <mclasen@redhat.com>
Fri, 3 Jun 2016 04:19:24 +0000 (00:19 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 3 Jun 2016 04:26:55 +0000 (00:26 -0400)
This is _gtk_style_context_get_pango_attributes, decoupled
from the GtkStyleContext. This will be used to drive css-styled
text rendering from css subnodes of widgets, e.g. for the value
in GtkScale.

gtk/gtkcssstyle.c
gtk/gtkcssstyleprivate.h
gtk/gtkstylecontext.c

index d801c646a269606bd4f28e2d3ddf18beb5c57e7b..f4a84a1e7412bdaef8aeda9d06d90c5295814829 100644 (file)
@@ -28,6 +28,7 @@
 #include "gtkcssinheritvalueprivate.h"
 #include "gtkcssinitialvalueprivate.h"
 #include "gtkcssnumbervalueprivate.h"
+#include "gtkcssrgbavalueprivate.h"
 #include "gtkcsssectionprivate.h"
 #include "gtkcssshorthandpropertyprivate.h"
 #include "gtkcssstringvalueprivate.h"
@@ -188,3 +189,78 @@ gtk_css_style_to_string (GtkCssStyle *style)
   return g_string_free (string, FALSE);
 }
 
+static PangoUnderline
+get_pango_underline_from_style (GtkTextDecorationStyle style)
+{
+  switch (style)
+    {
+    case GTK_CSS_TEXT_DECORATION_STYLE_DOUBLE:
+      return PANGO_UNDERLINE_DOUBLE;
+    case GTK_CSS_TEXT_DECORATION_STYLE_WAVY:
+      return PANGO_UNDERLINE_ERROR;
+    case GTK_CSS_TEXT_DECORATION_STYLE_SOLID:
+    default:
+      return PANGO_UNDERLINE_SINGLE;
+    }
+
+  g_return_val_if_reached (PANGO_UNDERLINE_SINGLE);
+}
+
+static PangoAttrList *
+add_pango_attr (PangoAttrList  *attrs,
+                PangoAttribute *attr)
+{
+  if (attrs == NULL)
+    attrs = pango_attr_list_new ();
+
+  pango_attr_list_insert (attrs, attr);
+
+  return attrs;
+}
+
+PangoAttrList *
+gtk_css_style_get_pango_attributes (GtkCssStyle *style)
+{
+  PangoAttrList *attrs = NULL;
+  GtkTextDecorationLine decoration_line;
+  GtkTextDecorationStyle decoration_style;
+  const GdkRGBA *color;
+  const GdkRGBA *decoration_color;
+  gint letter_spacing;
+
+  /* text-decoration */
+  decoration_line = _gtk_css_text_decoration_line_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_TEXT_DECORATION_LINE));
+  decoration_style = _gtk_css_text_decoration_style_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE));
+  color = _gtk_css_rgba_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_COLOR));
+  decoration_color = _gtk_css_rgba_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR));
+
+  switch (decoration_line)
+    {
+    case GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE:
+      attrs = add_pango_attr (attrs, pango_attr_underline_new (get_pango_underline_from_style (decoration_style)));
+      if (!gdk_rgba_equal (color, decoration_color))
+        attrs = add_pango_attr (attrs, pango_attr_underline_color_new (decoration_color->red * 65535. + 0.5,
+                                                                       decoration_color->green * 65535. + 0.5,
+                                                                       decoration_color->blue * 65535. + 0.5));
+      break;
+    case GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH:
+      attrs = add_pango_attr (attrs, pango_attr_strikethrough_new (TRUE));
+      if (!gdk_rgba_equal (color, decoration_color))
+        attrs = add_pango_attr (attrs, pango_attr_strikethrough_color_new (decoration_color->red * 65535. + 0.5,
+                                                                           decoration_color->green * 65535. + 0.5,
+                                                                           decoration_color->blue * 65535. + 0.5));
+      break;
+    case GTK_CSS_TEXT_DECORATION_LINE_NONE:
+    default:
+      break;
+    }
+
+  /* letter-spacing */
+  letter_spacing = _gtk_css_number_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_LETTER_SPACING), 100);
+  if (letter_spacing != 0)
+    {
+      attrs = add_pango_attr (attrs, pango_attr_letter_spacing_new (letter_spacing * PANGO_SCALE));
+    }
+
+  return attrs;
+}
index f1d165f8df03ad5a3993b52b8f56631fa1c82553..049574a4504d04bcb86cd4d58d4a9455912ff74d 100644 (file)
@@ -74,6 +74,8 @@ gboolean                gtk_css_style_print                     (GtkCssStyle
                                                                  GString                *string,
                                                                  guint                   indent,
                                                                  gboolean                skip_initial);
+PangoAttrList *         gtk_css_style_get_pango_attributes      (GtkCssStyle            *style);
+
 
 G_END_DECLS
 
index f5da8cab76aa1f226ae1297ae0599130830e386c..a6191bd0d11fc2b79d64493fb4d4a47a8c784785 100644 (file)
@@ -3034,79 +3034,10 @@ _gtk_style_context_get_icon_extents (GtkStyleContext *context,
                                          x, y, width, height);
 }
 
-static PangoUnderline
-get_pango_underline_from_style (GtkTextDecorationStyle style)
-{
-  switch (style)
-    {
-    case GTK_CSS_TEXT_DECORATION_STYLE_DOUBLE:
-      return PANGO_UNDERLINE_DOUBLE;
-    case GTK_CSS_TEXT_DECORATION_STYLE_WAVY:
-      return PANGO_UNDERLINE_ERROR;
-    case GTK_CSS_TEXT_DECORATION_STYLE_SOLID:
-    default:
-      return PANGO_UNDERLINE_SINGLE;
-    }
-
-  g_return_val_if_reached (PANGO_UNDERLINE_SINGLE);
-}
-
-static PangoAttrList *
-add_pango_attr(PangoAttrList *attrs, PangoAttribute *attr)
-{
-  if (attrs == NULL)
-    attrs = pango_attr_list_new ();
-
-  pango_attr_list_insert (attrs, attr);
-
-  return attrs;
-}
-
 PangoAttrList *
 _gtk_style_context_get_pango_attributes (GtkStyleContext *context)
 {
-  PangoAttrList *attrs = NULL;
-  GtkTextDecorationLine decoration_line;
-  GtkTextDecorationStyle decoration_style;
-  const GdkRGBA *color;
-  const GdkRGBA *decoration_color;
-  gint letter_spacing;
-
-  /* text-decoration */
-  decoration_line = _gtk_css_text_decoration_line_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_DECORATION_LINE));
-  decoration_style = _gtk_css_text_decoration_style_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE));
-  color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR));
-  decoration_color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR));
-
-  switch (decoration_line)
-    {
-    case GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE:
-      attrs = add_pango_attr (attrs, pango_attr_underline_new (get_pango_underline_from_style (decoration_style)));
-      if (!gdk_rgba_equal (color, decoration_color))
-        attrs = add_pango_attr (attrs, pango_attr_underline_color_new (decoration_color->red * 65535. + 0.5,
-                                                                       decoration_color->green * 65535. + 0.5,
-                                                                       decoration_color->blue * 65535. + 0.5));
-      break;
-    case GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH:
-      attrs = add_pango_attr (attrs, pango_attr_strikethrough_new (TRUE));
-      if (!gdk_rgba_equal (color, decoration_color))
-        attrs = add_pango_attr (attrs, pango_attr_strikethrough_color_new (decoration_color->red * 65535. + 0.5,
-                                                                           decoration_color->green * 65535. + 0.5,
-                                                                           decoration_color->blue * 65535. + 0.5));
-      break;
-    case GTK_CSS_TEXT_DECORATION_LINE_NONE:
-    default:
-      break;
-    }
-
-  /* letter-spacing */
-  letter_spacing = _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_LETTER_SPACING), 100);
-  if (letter_spacing != 0)
-    {
-      attrs = add_pango_attr (attrs, pango_attr_letter_spacing_new (letter_spacing * PANGO_SCALE));
-    }
-
-    return attrs;
+  return gtk_css_style_get_pango_attributes (gtk_style_context_lookup_style (context));
 }
 
 static AtkAttributeSet *